package com.itheima.service.impl;

import com.alibaba.dubbo.config.annotation.Service;
import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import com.itheima.dao.RoleDao;
import com.itheima.entity.PageResult;
import com.itheima.pojo.CheckItem;
import com.itheima.pojo.Menu;
import com.itheima.pojo.Permission;
import com.itheima.pojo.Role;
import com.itheima.service.RoleService;
import org.apache.poi.ss.formula.ptg.MemAreaPtg;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;


import java.util.HashMap;
import java.util.List;
import java.util.Map;


/**
 * 角色管理  服务接口实现类
 */
@Service(interfaceClass = RoleService.class)
@Transactional
public class RoleServiceImpl implements RoleService {

    @Autowired
    private RoleDao roleDao;

    //角色管理  分页查询
    @Override
    public PageResult findPage(Integer currentPage, Integer pageSize, String queryString) {
        //第一步：设置分页参数
        PageHelper.startPage(currentPage, pageSize);
        //第二步：查询数据库（代码一定要紧跟设置分页代码  没有手动分页 select * from table where name = 'xx'  ）
        Page<CheckItem> checkItemPage = roleDao.selectByCondition(queryString);
        return new PageResult(checkItemPage.getTotal(), checkItemPage.getResult());
    }

    //角色管理  模糊查询
    @Override
    public PageResult query(String queryString) {
        //根据角色名称模糊查询
        Page<CheckItem> checkItemPage1 = roleDao.query1(queryString);
        //判断如果根据名称没有查找出数据就根据权限关键字查询
        if (checkItemPage1.size() != 0) {
            //如果有返回数据
            return new PageResult(checkItemPage1.getTotal(), checkItemPage1.getResult());
        } else {
            Page<CheckItem> checkItemPage2 = roleDao.query2(queryString);
            //如果没有就使用角色关键字查询
            return new PageResult(checkItemPage2.getTotal(), checkItemPage2.getResult());
        }
    }

    //角色管理  新增角色
    @Override
    public void add(Role role) {
        roleDao.add(role);
    }

    //回显角色数据
    @Override
    public Role findById(Integer groupId) {
        Role role = roleDao.findById(groupId);

        return role;
    }

    //编辑角色
    @Override
    public void edit(Role role) {
        roleDao.edit(role);
    }

    //删除角色
    @Override
    public void deleteById(Integer id) {
        roleDao.deleteById(id);
    }

    //发送请求获取页面回显参数  权限
    @Override
    public List<Permission> QueryAuthority() {
        List<Permission> permissionList = roleDao.QueryAuthority();

        return permissionList;
    }

    //发送请求获取页面回显参数  菜单
    @Override
    public List<Menu> InquiryMenu() {
        List<Menu> menus = roleDao.InquiryMenu();
        return menus;
    }

    //回显权限选择项数据
    @Override
    public List<Integer> jurisdictionIds(Integer jurisdictionId) {
        List<Integer> jurisdictionIds = roleDao.jurisdictionIds(jurisdictionId);
        return jurisdictionIds;
    }

    //回显菜单选择项数据
    @Override
    public List<Integer> menuIds(Integer menuId) {
        List<Integer> menuIds = roleDao.menuIds(menuId);
        return menuIds;
    }

    //分配权限与菜单   权限
    @Override
    public void jurisdictionId(List<Integer> jurisdictionIds, Integer id) {
        //添加前删除所以避免重复  权限
        roleDao.sbid1(id);
        for (Integer jurisdictionId : jurisdictionIds) {
            Map map = new HashMap();
            map.put("jurisdictionId", jurisdictionId);
            map.put("id", id);
            roleDao.jurisdictionId(map);
        }
    }

    //分配权限与菜单   菜单
    @Override
    public void menuId(List<Integer> menuIds, Integer id) {
        //添加前删除所以避免重复  菜单
        roleDao.sbid2(id);
        for (Integer menuId : menuIds) {
            Map map = new HashMap();
            map.put("menuId", menuId);
            map.put("id", id);
            roleDao.menuId(map);
        }
    }

    //校验是否有关联
    @Override
    public boolean check(Integer id) {
        //校验权限
        Integer nb1 = roleDao.check1(id);
        if (nb1 > 0) {
            throw new RuntimeException("角色和权限关联不可以删除");
        }
        //校验菜单
        Integer nb2 = roleDao.check2(id);
        if (nb2 > 0) {
            throw new RuntimeException("角色和菜单关联不可以删除");
        }
        //判断是否可以删除
        return true;

    }

    /**
     * 根据roleId查询所用的user的id
     */
    @Override
    public List<Integer> findUserIdsByRoleId(Integer roleId) {
        return roleDao.findUserIdsByRoleId(roleId);
    }

    /**
     * 存入角色和用户的关系表
     */
    @Override
    public void editUser(Integer[] userIds ,Integer rId) {
        //是否于用户关联
        int count =roleDao.checkUser(rId);
        if (count>0){
            //用就删除掉
            roleDao.deleteRoleUserByRid(rId);
        }

        if (userIds != null && userIds.length > 0) {
            for (Integer userId : userIds) {
                //添加关联
                roleDao.addRoleUser(rId,userId);
            }
        }
    }

}
